const logger = require('./logger');

class TencentIMService {
    constructor() {
        this.sdkAppId = process.env.TENCENT_CLOUD_SDK_APP_ID;
        this.secretKey = process.env.TENCENT_CLOUD_SECRET_KEY;

        if (!this.sdkAppId || !this.secretKey) {
            logger.warn('腾讯云IM配置缺失，请设置TENCENT_CLOUD_SDK_APP_ID和TENCENT_CLOUD_SECRET_KEY环境变量');
        }
    }

    /**
     * 生成UserSig（用户签名）
     * @param {string} userId - 用户ID
     * @param {number} expire - 签名有效期（秒），默认180天
     * @returns {Object} - 包含userSig和过期时间等信息
     */
    generateUserSig(userId, expire = 15552000) {
        if (!this.sdkAppId || !this.secretKey) {
            throw new Error('腾讯云IM配置缺失');
        }

        try {
            const currentTime = Math.floor(Date.now() / 1000);
            const expireTime = currentTime + expire;
            var TLSSigAPIv2 = require('tls-sig-api-v2');

            var api = new TLSSigAPIv2.Api(this.sdkAppId, this.secretKey);
            var sig = api.genSig(userId, expire);

            return {
                userSig: sig,
                expireTime,
                currentTime,
                sdkAppId: this.sdkAppId,
                userId
            };

        } catch (error) {
            logger.error('生成UserSig失败:', error);
            throw new Error(`生成UserSig失败: ${error.message}`);
        }
    }

    /**
     * 验证UserSig（验证签名是否有效）
     * @param {string} userSig - 用户签名
     * @param {string} userId - 用户ID
     * @returns {boolean} - 是否有效
     */
    verifyUserSig(userSig, userId) {
        try {
            // 解码base64
            const decoded = Buffer.from(userSig, 'base64').toString('utf8');
            const sigData = JSON.parse(decoded);

            // 检查过期时间
            const currentTime = Math.floor(Date.now() / 1000);
            if (parseInt(sigData['TLS.expire']) < currentTime) {
                return false;
            }

            // 验证用户ID
            if (sigData['TLS.identifier'] !== userId.toString()) {
                return false;
            }

            // 验证SDKAppID
            if (parseInt(sigData['TLS.sdkappid']) !== parseInt(this.sdkAppId)) {
                return false;
            }

            return true;

        } catch (error) {
            logger.error('验证UserSig失败:', error);
            return false;
        }
    }
    /**
     * 生成聊天会话ID（用于单聊）
     * @param {string} userId1 - 用户1的ID
     * @param {string} userId2 - 用户2的ID
     * @returns {string} - 会话ID
     */
    generateConversationId(userId1, userId2) {
        const users = [userId1, userId2].sort();
        return `c2c_${users[0]}_${users[1]}`;
    }

    /**
     * 从会话ID解析用户ID
     * @param {string} conversationId - 会话ID
     * @returns {Array} - 包含两个用户ID的数组
     */
    parseConversationId(conversationId) {
        if (!conversationId.startsWith('c2c_')) {
            throw new Error('无效的会话ID格式');
        }

        const parts = conversationId.split('_');
        if (parts.length !== 3) {
            throw new Error('无效的会话ID格式');
        }

        return [parts[1], parts[2]];
    }

    /**
     * 检查配置是否完整
     * @returns {boolean} - 配置是否完整
     */
    isConfigured() {
        return !!(this.sdkAppId && this.secretKey);
    }

    /**
     * 获取配置信息（隐藏敏感信息）
     * @returns {Object} - 配置信息
     */
    getConfig() {
        return {
            sdkAppId: this.sdkAppId,
            isConfigured: this.isConfigured(),
            secretKeyConfigured: !!this.secretKey
        };
    }
}

// 创建单例实例
const tencentIMService = new TencentIMService();

module.exports = tencentIMService;